home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / gfx / 3d / Skulpt_src.lha / sKulpt-src / Objects-Geom.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-26  |  14.6 KB  |  491 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11. #include <math.h>
  12.  
  13. // Includes D3D
  14. #define  D3D_OVERLOADS
  15. #include <ddraw.h>
  16. #include <d3d.h>
  17. #include <d3dx.h>
  18.  
  19. // Includes utilitaires D3D
  20. #include "d3dmath.h"
  21. #include "d3dutil.h"
  22. #include "D3DEnum.h"
  23.  
  24. // Ids Resources
  25. //#include "resource.h"
  26.  
  27. // Constantes
  28. #include "const.h"
  29.  
  30. // Types
  31. #include "types.h"
  32.  
  33. // Variables globales projet
  34. #include "vars.h"
  35.  
  36. // Prototypes fonctions autres modules
  37. #include "proto.h"
  38.  
  39. // Macros
  40. #include "macros.h"
  41.  
  42. #define fswap(f1, f2) { FLOAT f3 = f2 ; f2 = f1 ; f1 = f3; }
  43.  
  44. void vAddSphere(D3DVECTOR vCenter, float r, int horiz, int vert, BOOL bHalf)
  45. {
  46.     float hIncr = 2.f * g_PI / horiz;    
  47.     float vIncr = g_PI / vert;
  48.     D3DVECTOR a, b, c;
  49.  
  50.     for(int i = 0; i < (bHalf ? vert / 2 : vert) ; i++)
  51.     {
  52.         float rTemp1, rTemp2;        // rayon des deux cercles
  53.         
  54.         rTemp1 = (float) sin(i * vIncr) * r;
  55.         rTemp2 = (float) sin((i + 1) * vIncr) * r;
  56.  
  57.         for(int j = 0; j < horiz; j++)
  58.         {
  59.             a.x = (float) cos(   j    * hIncr) * rTemp1;
  60.             a.y = (float) cos(   i    * vIncr) * r     ;
  61.             a.z = (float) sin(   j    * hIncr) * rTemp1;
  62.  
  63.             b.x = (float) cos((j + 1) * hIncr) * rTemp1;
  64.             b.y = (float) cos(   i    * vIncr) * r     ;
  65.             b.z = (float) sin((j + 1) * hIncr) * rTemp1;
  66.  
  67.             c.x = (float) cos(   j    * hIncr) * rTemp2;
  68.             c.y = (float) cos((i + 1) * vIncr) * r     ;
  69.             c.z = (float) sin(   j    * hIncr) * rTemp2;
  70.  
  71.             switch(lWActive)
  72.             {
  73.                 case XDC_WID_FACE : // X et Y
  74.                     fswap(a.z, a.y); fswap(a.x, a.y);
  75.                     fswap(b.z, b.y); fswap(b.x, b.y);
  76.                     fswap(c.z, c.y); fswap(c.x, c.y);
  77.                     break;
  78.  
  79.                 case XDC_WID_SIDE : // Z et Y
  80.                     fswap(a.x, a.y); fswap(a.z, a.y);
  81.                     fswap(b.x, b.y); fswap(b.z, b.y);
  82.                     fswap(c.x, c.y); fswap(c.z, c.y);
  83.                     break;
  84.             }
  85.  
  86.             iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  87.                           iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  88.                           iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  89.                           0);
  90.  
  91.             a.x = (float) cos((j + 1) * hIncr) * rTemp2;
  92.             a.y = (float) cos((i + 1) * vIncr) * r     ;
  93.             a.z = (float) sin((j + 1) * hIncr) * rTemp2;
  94.  
  95.             switch(lWActive)
  96.             {
  97.                 case XDC_WID_FACE : // X et Y
  98.                     fswap(a.z, a.y); fswap(a.x, a.y);
  99.                     break;
  100.  
  101.                 case XDC_WID_SIDE : // Z et Y
  102.                     fswap(a.x, a.y); fswap(a.z, a.y);
  103.                     break;
  104.             }
  105.  
  106.             iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  107.                           iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  108.                           iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  109.                           0);
  110.         }
  111.     }
  112. }
  113.  
  114. void vAddBoing(D3DVECTOR vCenter, float r)
  115. {
  116.     int horiz = 14, vert = 6;
  117.     float hIncr = 2.f * g_PI / horiz;    
  118.     float vIncr = g_PI / vert;
  119.     D3DVECTOR a, b, c;
  120.  
  121.     for(int i = 0; i < vert; i++)
  122.     {
  123.         float rTemp1, rTemp2;        // rayon des deux cercles
  124.         
  125.         rTemp1 = (float) sin(i * vIncr) * r;
  126.         rTemp2 = (float) sin((i + 1) * vIncr) * r;
  127.  
  128.         for(int j = 0; j < horiz; j++)
  129.         {
  130.             a.x = (float) cos(   j    * hIncr) * rTemp1;
  131.             a.y = (float) cos(   i    * vIncr) * r     ;
  132.             a.z = (float) sin(   j    * hIncr) * rTemp1;
  133.  
  134.             b.x = (float) cos((j + 1) * hIncr) * rTemp1;
  135.             b.y = (float) cos(   i    * vIncr) * r     ;
  136.             b.z = (float) sin((j + 1) * hIncr) * rTemp1;
  137.  
  138.             c.x = (float) cos(   j    * hIncr) * rTemp2;
  139.             c.y = (float) cos((i + 1) * vIncr) * r     ;
  140.             c.z = (float) sin(   j    * hIncr) * rTemp2;
  141.  
  142.             switch(lWActive)
  143.             {
  144.                 case XDC_WID_FACE : // X et Y
  145.                     fswap(a.z, a.y); fswap(a.x, a.y);
  146.                     fswap(b.z, b.y); fswap(b.x, b.y);
  147.                     fswap(c.z, c.y); fswap(c.x, c.y);
  148.                     break;
  149.  
  150.                 case XDC_WID_SIDE : // Z et Y
  151.                     fswap(a.x, a.y); fswap(a.z, a.y);
  152.                     fswap(b.x, b.y); fswap(b.z, b.y);
  153.                     fswap(c.x, c.y); fswap(c.z, c.y);
  154.                     break;
  155.             }
  156.  
  157.             iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  158.                           iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  159.                           iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  160.                           ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
  161.         
  162.  
  163.             a.x = (float) cos((j + 1) * hIncr) * rTemp2;
  164.             a.y = (float) cos((i + 1) * vIncr) * r     ;
  165.             a.z = (float) sin((j + 1) * hIncr) * rTemp2;
  166.  
  167.             switch(lWActive)
  168.             {
  169.                 case XDC_WID_FACE : // X et Y
  170.                     fswap(a.z, a.y); fswap(a.x, a.y);
  171.                     break;
  172.  
  173.                 case XDC_WID_SIDE : // Z et Y
  174.                     fswap(a.x, a.y); fswap(a.z, a.y);
  175.                     break;
  176.             }
  177.         
  178.              iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  179.                            iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  180.                            iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  181.                            ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
  182.         
  183.         }
  184.     }
  185. }
  186.  
  187. #define AddTorusCalcX(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * cos((i) * 2*g_PI/n)))
  188. #define AddTorusCalcY(i,j) ((float) (  r * sin((j) * 2*g_PI/m)))
  189. #define AddTorusCalcZ(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * sin((i) * 2*g_PI/n)))
  190.  
  191. void vAddTorus(D3DVECTOR vCenter, float R, float r, int n, int m)
  192. {
  193.     D3DVECTOR a, b, c, d;
  194.  
  195.     for(int i = 0; i <= n; i++)
  196.         for(int j = 0; j <= m; j++)
  197.         {
  198.             a.x = AddTorusCalcX( i , j ); a.y = AddTorusCalcY( i , j );    a.z = AddTorusCalcZ( i , j ); 
  199.             b.x = AddTorusCalcX( i ,j+1); b.y = AddTorusCalcY( i ,j+1);    b.z = AddTorusCalcZ( i ,j+1);
  200.             c.x = AddTorusCalcX(i+1, j ); c.y = AddTorusCalcY(i+1, j );    c.z = AddTorusCalcZ(i+1, j );
  201.             d.x = AddTorusCalcX(i+1,j+1); d.y = AddTorusCalcY(i+1,j+1);    d.z = AddTorusCalcZ(i+1,j+1);
  202.  
  203.             switch(lWActive)
  204.             {
  205.                 case XDC_WID_FACE : // X et Y
  206.                     fswap(a.z, a.y); fswap(a.x, a.y);
  207.                     fswap(b.z, b.y); fswap(b.x, b.y);
  208.                     fswap(c.z, c.y); fswap(c.x, c.y);
  209.                     fswap(d.z, d.y); fswap(d.x, d.y);
  210.                     break;
  211.  
  212.                 case XDC_WID_SIDE : // Z et Y
  213.                     fswap(a.x, a.y); fswap(a.z, a.y);
  214.                     fswap(b.x, b.y); fswap(b.z, b.y);
  215.                     fswap(c.x, c.y); fswap(c.z, c.y);
  216.                     fswap(d.x, d.y); fswap(d.z, d.y);
  217.                     break;
  218.             }
  219.  
  220.              iMakeTriangle(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  221.                            iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  222.                            iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  223.                            ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
  224.  
  225.              iMakeTriangle(iMakeVertex(c + vCenter, XDC_ALLOWSAME),
  226.                            iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  227.                            iMakeVertex(d + vCenter, XDC_ALLOWSAME),
  228.                            ((i & 1)?(j & 1):!(j & 1)) ? 2 : 0);
  229.         }
  230. }
  231.  
  232. void vAddDisk(D3DVECTOR vCenter, float r, int iSubdiv)
  233. {
  234.     float fIncr = 2.f * g_PI / iSubdiv;    
  235.     D3DVECTOR a, b;
  236.     int iCenter = iMakeVertex(vCenter, XDC_ALLOWSAME);
  237.  
  238.     for(int j = 0; j < iSubdiv; j++)
  239.     {
  240.         a.x = (float) sin(   j    * fIncr) * r;
  241.         a.y = (float) cos(   j    * fIncr) * r;
  242.         b.x = (float) sin((j + 1) * fIncr) * r;
  243.         b.y = (float) cos((j + 1) * fIncr) * r;
  244.         a.z = b.z = 0;
  245.  
  246.         switch(lWActive)
  247.         {
  248.             case XDC_WID_TOP : // X et Z
  249.                 fswap(a.y, a.z); fswap(a.x, a.z);
  250.                 fswap(b.y, b.z); fswap(b.x, b.z);
  251.                 break;
  252.  
  253.             case XDC_WID_SIDE : // Z et Y
  254.                 fswap(a.x, a.z); fswap(a.z, a.y);
  255.                 fswap(b.x, b.z); fswap(b.z, b.y);
  256.                 break;
  257.         }
  258.  
  259.         iMakeTriangle(iCenter,
  260.                       iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  261.                       iMakeVertex(b + vCenter, XDC_ALLOWSAME),
  262.                       (j & 1) ? 0 : 2);
  263.     }
  264. }
  265.  
  266. void vAddCircle(D3DVECTOR vCenter, float r, int iSubdiv)
  267. {
  268.     float fIncr = 2.f * g_PI / iSubdiv;    
  269.  
  270.     D3DVECTOR a, b;
  271.  
  272.     for(int j = 0; j < iSubdiv; j++)
  273.     {
  274.         a.x = (float) sin(   j    * fIncr) * r;
  275.         a.y = (float) cos(   j    * fIncr) * r;
  276.         b.x = (float) sin((j + 1) * fIncr) * r;
  277.         b.y = (float) cos((j + 1) * fIncr) * r;
  278.         a.z = b.z = 0;
  279.  
  280.         switch(lWActive)
  281.         {
  282.             case XDC_WID_TOP : // X et Z
  283.                 fswap(a.y, a.z); fswap(a.x, a.z);
  284.                 fswap(b.y, b.z); fswap(b.x, b.z);
  285.                 break;
  286.  
  287.             case XDC_WID_SIDE : // Z et Y
  288.                 fswap(a.x, a.z); fswap(a.z, a.y);
  289.                 fswap(b.x, b.z); fswap(b.z, b.y);
  290.                 break;
  291.         }
  292.  
  293.         iMakeEdge(iMakeVertex(a + vCenter, XDC_ALLOWSAME),
  294.                   iMakeVertex(b + vCenter, XDC_ALLOWSAME));
  295.     }
  296. }
  297.  
  298. void vAddCube(D3DVECTOR vCenter, float r)
  299. {
  300.         D3DVECTOR   v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
  301.         D3DVECTOR   v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
  302.         D3DVECTOR   v3 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z - r);
  303.         D3DVECTOR   v4 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
  304.         D3DVECTOR   v5 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
  305.         D3DVECTOR   v6 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z + r);
  306.         D3DVECTOR   v7 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z + r);
  307.         D3DVECTOR   v8 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z + r);
  308.         int         i1 = iMakeVertex(v1, XDC_FORCENEW);
  309.         int         i2 = iMakeVertex(v2, XDC_FORCENEW);
  310.         int         i3 = iMakeVertex(v3, XDC_FORCENEW);
  311.         int         i4 = iMakeVertex(v4, XDC_FORCENEW);
  312.         int         i5 = iMakeVertex(v5, XDC_FORCENEW);
  313.         int         i6 = iMakeVertex(v6, XDC_FORCENEW);
  314.         int         i7 = iMakeVertex(v7, XDC_FORCENEW);
  315.         int         i8 = iMakeVertex(v8, XDC_FORCENEW);
  316.  
  317.         // Devant
  318.         iMakeTriangle(i1, i2, i3, 0);
  319.         iMakeTriangle(i1, i3, i4, 0);
  320.  
  321.         // Derrière
  322.         iMakeTriangle(i5, i6, i7, 0);
  323.         iMakeTriangle(i5, i7, i8, 0);
  324.  
  325.         // Dessous
  326.         iMakeTriangle(i1, i2, i6, 0);
  327.         iMakeTriangle(i1, i5, i6, 0);
  328.  
  329.         // Dessus
  330.         iMakeTriangle(i3, i4, i8, 0);
  331.         iMakeTriangle(i3, i7, i8, 0);
  332.  
  333.         // Droite
  334.         iMakeTriangle(i2, i3, i7, 0);
  335.         iMakeTriangle(i2, i6, i7, 0);
  336.  
  337.         // Gauche
  338.         iMakeTriangle(i1, i4, i8, 0);
  339.         iMakeTriangle(i1, i5, i8, 0);
  340. }
  341.  
  342. void vAddPrism(D3DVECTOR vCenter, float r)
  343. {
  344.     D3DVECTOR   v1, v2, v3, v4;
  345.  
  346.     switch(lWActive)
  347.     {
  348.         case XDC_WID_FACE : // X et Y
  349.             v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
  350.             v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
  351.             v3 = D3DVECTOR(vCenter.x + r, vCenter.y + r, vCenter.z - r);
  352.             v4 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
  353.             break;
  354.  
  355.         case XDC_WID_TOP : // X et Z
  356.             v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
  357.             v2 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z - r);
  358.             v3 = D3DVECTOR(vCenter.x + r, vCenter.y - r, vCenter.z + r);
  359.             v4 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
  360.             break;
  361.  
  362.         case XDC_WID_SIDE : // Z et Y
  363.             v1 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z - r);
  364.             v2 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z - r);
  365.             v3 = D3DVECTOR(vCenter.x - r, vCenter.y + r, vCenter.z + r);
  366.             v4 = D3DVECTOR(vCenter.x - r, vCenter.y - r, vCenter.z + r);
  367.             break;
  368.     }
  369.  
  370.     int i1 = iMakeVertex(v1, XDC_FORCENEW);
  371.     int i2 = iMakeVertex(v2, XDC_FORCENEW);
  372.     int i3 = iMakeVertex(v3, XDC_FORCENEW);
  373.     int i4 = iMakeVertex(v4, XDC_FORCENEW);
  374.     int i5 = iMakeVertex(vCenter, XDC_FORCENEW);
  375.  
  376.     iMakeTriangle(i1, i2, i3, 0);
  377.     iMakeTriangle(i1, i3, i4, 0);
  378.  
  379.     iMakeTriangle(i1, i2, i5, 0);
  380.     iMakeTriangle(i2, i3, i5, 0);
  381.     iMakeTriangle(i3, i4, i5, 0);
  382.     iMakeTriangle(i4, i1, i5, 0);
  383. }
  384.  
  385. #define XDC_OBJ_CYLN 1
  386. #define XDC_OBJ_TUBE 2
  387. #define XDC_OBJ_CONE 3
  388.  
  389. static void vAddCylOrTubeOrCone(D3DVECTOR vCenter, float r, int iSubdiv, int iObjType)
  390. {
  391.     float fIncr = 2.f * g_PI / iSubdiv;
  392.     D3DVECTOR a, b, vC1, vC2;
  393.     int iCenter1, iCenter2;
  394.  
  395.     switch(lWActive)
  396.     {
  397.         case XDC_WID_FACE : // X et Y
  398.             vC1 = vCenter - D3DVECTOR(0., 0., r);
  399.             vC2 = vCenter + D3DVECTOR(0., 0., r);
  400.             break;
  401.  
  402.         case XDC_WID_TOP : // X et Z
  403.             vC1 = vCenter - D3DVECTOR(0., r, 0.);
  404.             vC2 = vCenter + D3DVECTOR(0., r, 0.);
  405.             break;
  406.  
  407.         case XDC_WID_SIDE : // Z et Y
  408.             vC1 = vCenter - D3DVECTOR(r, 0., 0.);
  409.             vC2 = vCenter + D3DVECTOR(r, 0., 0.);
  410.             break;
  411.     }
  412.  
  413.     switch(iObjType)
  414.     {
  415.         case XDC_OBJ_CYLN :
  416.         case XDC_OBJ_CONE :
  417.             iCenter1 = iMakeVertex(vC1, XDC_FORCENEW);
  418.             iCenter2 = iMakeVertex(vC2, XDC_FORCENEW);
  419.             break;
  420.  
  421.     }
  422.  
  423.     for(int j = 0; j < iSubdiv; j++)
  424.     {
  425.         int iA1, iA2, iB1, iB2;
  426.  
  427.         a.x = (float) sin(   j    * fIncr) * r;
  428.         a.y = (float) cos(   j    * fIncr) * r;
  429.         b.x = (float) sin((j + 1) * fIncr) * r;
  430.         b.y = (float) cos((j + 1) * fIncr) * r;
  431.         a.z = b.z = 0;
  432.  
  433.         switch(lWActive)
  434.         {
  435.             case XDC_WID_TOP : // X et Z
  436.                 fswap(a.y, a.z); fswap(a.x, a.z);
  437.                 fswap(b.y, b.z); fswap(b.x, b.z);
  438.                 break;
  439.  
  440.             case XDC_WID_SIDE : // Z et Y
  441.                 fswap(a.x, a.z); fswap(a.z, a.y);
  442.                 fswap(b.x, b.z); fswap(b.z, b.y);
  443.                 break;
  444.         }
  445.  
  446.         switch(iObjType)
  447.         {
  448.             case XDC_OBJ_CYLN :
  449.             case XDC_OBJ_TUBE :
  450.  
  451.                 iA1 = iMakeVertex(a + vC1, XDC_ALLOWSAME),
  452.                 iB1 = iMakeVertex(b + vC1, XDC_ALLOWSAME),
  453.                 iA2 = iMakeVertex(a + vC2, XDC_ALLOWSAME),
  454.                 iB2 = iMakeVertex(b + vC2, XDC_ALLOWSAME);
  455.  
  456.                 iMakeTriangle(iA1, iB1, iA2, (j & 1) ? 0 : 2);
  457.                 iMakeTriangle(iA2, iB1, iB2, (j & 1) ? 0 : 2);
  458.  
  459.                 if (iObjType == XDC_OBJ_TUBE) break;
  460.  
  461.                 iMakeTriangle(iCenter1, iA1, iB1, (j & 1) ? 0 : 2);
  462.                 iMakeTriangle(iCenter2, iA2, iB2, (j & 1) ? 0 : 2);
  463.                 break;
  464.  
  465.             case XDC_OBJ_CONE :
  466.                 iA1 = iMakeVertex(a + vC1, XDC_ALLOWSAME),
  467.                 iB1 = iMakeVertex(b + vC1, XDC_ALLOWSAME),
  468.  
  469.                 iMakeTriangle(iCenter1, iA1, iB1, (j & 1) ? 0 : 2);
  470.                 iMakeTriangle(iCenter2, iA1, iB1, (j & 1) ? 0 : 2);
  471.                 break;
  472.         }
  473.     }
  474. }
  475.  
  476. void vAddCyl(D3DVECTOR vCenter, float r, int iSubdiv)
  477. {
  478.     vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_CYLN);
  479. }
  480.  
  481. void vAddTube(D3DVECTOR vCenter, float r, int iSubdiv)
  482. {
  483.     vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_TUBE);
  484. }
  485.  
  486. void vAddCone(D3DVECTOR vCenter, float r, int iSubdiv)
  487. {
  488.     vAddCylOrTubeOrCone(vCenter, r, iSubdiv, XDC_OBJ_CONE);
  489. }
  490.  
  491.